#-*- coding:utf-8 -*-
#相对前面，做了如下改进
# 1.能进入详情页面，继续爬取需要的信息，而不是仅在列表页上操作。
# 2.能把详情而中的第一张主图，下载到本机，并在数据库中存入对应的文件名

import requests;
from lxml import etree;
import time;
import re;
import mysql.connector;
import uuid;

conn=mysql.connector.connect(user='root',password='123456',database='jiang');
cursor=conn.cursor();

header={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'};
start_url='https://cd.lianjia.com/ershoufang/pg';
unit_price_partten=re.compile(r'\d{4,7}');

#爬取小区详情
def spider_detail(url,header):
	detail={};
	html=requests.get(url,headers=header);
	selector=etree.HTML(html.text);
	#获取链家的编号
	detail['lj_code']=selector.xpath('/html/body/div[5]/div[2]/div[4]/div[4]/span[2]/text()')[0];
	#获取主图url地址
	pic_url=selector.xpath('//*[@id="topImg"]/div[2]/ul/li/@data-pic')[0];
	#解析出后缀名
	suffix=re.findall(r'.\w{3,4}$',pic_url)[0];
	#下载图片
	b_pic=requests.get(pic_url,headers=header);
	#生成文件名
	detail['filename']=str(uuid.uuid1())+suffix;
	#图片存盘（以二进制写入文件）
	with open('./lianjia_pic/'+detail['filename'],'wb') as f:
		f.write(b_pic.content);

	return detail;


#爬取小区列表，迭代每一页
for i in range(1,3):
	url=start_url+str(i);
	html=requests.get(url,headers=header);
	time.sleep(1);
	selector=etree.HTML(html.text);
	#所有小区信息，都是存在 li 中的，获取所有的li
	xiaoquList=selector.xpath('/html/body/div[4]/div[1]/ul/li');
	#迭代本页所有小区
	for xiaoqu in xiaoquList:
		#小区名
		name=xiaoqu.xpath('div[1]/div[2]/div/a/text()')[0];
		#单价
		unit_price=xiaoqu.xpath('div[1]/div[6]/div[2]/span/text()')[0];
		result=re.findall(unit_price_partten,unit_price);
		unit_price=float(result[0]);
		#总价
		total_price=xiaoqu.xpath('div[1]/div[6]/div[1]/span/text()')[0];
		total_price=float(total_price);
		pianqu=xiaoqu.xpath('div[1]/div[3]/div/a/text()')[0];#片区名
		#爬取详情(包含了下载图片)
		detail_url=xiaoqu.xpath('div[1]/div[1]/a/@href')[0];#详情url
		detail=spider_detail(detail_url,header);
		item=[name,unit_price,total_price,pianqu];
		sql="INSERT INTO lianjia(name,unit_price,total_price,pianqu,lj_code,main_pic) VALUES ('%s',%d,%d,'%s','%s','%s')"%(name,unit_price,total_price,pianqu,detail['lj_code'],detail['filename']);
		cursor.execute(sql);
		print('正在抓取%d'%i,item);
	conn.commit();		
		

	